package imagesBuffer;

import static imagesBuffer.ImageState.buffered;
import static imagesBuffer.ImageState.buffering;
import static imagesBuffer.ImageState.fullLoaded;
import static imagesBuffer.ImageState.loading;
import static imagesBuffer.ImageState.outOfMemory;
import android.graphics.Bitmap;

public class BufferableBitmap {
	private ImageState state;
	private String imagePath;
	private Bitmap bitmap;
	private boolean changed;
	
	/**
	 * @param imagePath percorso dell'immagine
	 */
	public BufferableBitmap(String imagePath) {
		this.imagePath=imagePath;
		state=outOfMemory;
	}
	
	/**
	 * cambia lo stato dell'immagine rispetto alla RAM
	 * @param newState: 
	 * 		outOfMemory: l'immagine corrente viene tolta dalla memoria
	 * 		loading/fullLoaded: l'immagine viene caricata completamente in memoria
	 * 		buffering/buffered: viene caricata una versione ridotta dell'immagine
	 */
	public synchronized void changeState(ImageState newState){
		if(state==newState){
			return;
		}
		if(newState==outOfMemory){
			state=outOfMemory;
			bitmap=null;
		}else if(newState==loading||newState==fullLoaded){
			if(state==loading||state==fullLoaded){
				return;
			}
			state=loading;
			BitmapLoader loader=new BitmapLoader(imagePath);
			loader.run();
			if(state==loading){
				bitmap=loader.bitmap;
				state=fullLoaded;
			}
		}else{
			if(state==buffering||state==buffered){
				return;
			}
			state=buffering;
			BitmapBufferer bufferer=new BitmapBufferer(imagePath);
			bufferer.run();
			if(state==buffering){
				bitmap=bufferer.bitmap;
				state=buffered;
			}
		}
		changed=true;
	}
	
	/**
	 * @return la condizione attuale dell'immagine
	 */
	public ImageState getState() {
		return state;
	}
	
	/**
	 * @return l'immagine esattamente come è stata caricata in memoria
	 */
	public Bitmap getBitmap() {
		return bitmap;
	}
	
	/**
	 * @return il percorso dell'immagine
	 */
	public String getImagePath() {
		return imagePath;
	}
	
	/**
	 * @return controlla se lo stato dell'immagine è cambiato
	 * dall'ultima chiamata a questo metodo
	 */
	public boolean isChanged() {
		if(changed){
			changed=false;
			return true;
		}else{
			return false;
		}
	}
}
